package es.tikitaka.actions.sanciones;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;

import es.tikitaka.dao.AmonestacionService;
import es.tikitaka.dao.SancionService;
import es.tikitaka.dao.SegJugadorService;
import es.tikitaka.dao.TemporadaService;
import es.tikitaka.dao.TipoSancionDicService;
import es.tikitaka.dictionary.TipoAmonestacionDic;
import es.tikitaka.dictionary.TipoSancionDic;
import es.tikitaka.domain.Amonestacion;
import es.tikitaka.domain.Sancion;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.jugador.SegJugador;
import es.tikitaka.domain.liga.Jornada;
import es.tikitaka.domain.liga.PartidoL;
import es.tikitaka.domain.playoffs.PartidoPO;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("sancionesAction")
@Scope(ScopeType.CONVERSATION)
public class SancionesAction {

	private List<Temporada> temporadas;
	private Temporada temporada;
	private Jornada jornada;
	private List<Jornada> jornadas;

	private List<Amonestacion> amonestacionesJornada;
	@DataModel("amonestados")
	private List<SegJugador> amonestados;
	@DataModelSelection("amonestados")
	private SegJugador amonestadoItem;

	private int totalAmon;

	private Sancion sancion;
	private List<TipoSancionDic> tiposSancion;
	private String tarjeta;

	private boolean consulta = false;

	@In(create = true)
	private TemporadaService temporadaService;

	@In(create = true)
	private AmonestacionService amonestacionService;

	@In(create = true)
	private SancionService sancionService;

	@In(create = true)
	private TipoSancionDicService tipoSancionService;

	@In(create = true)
	private SegJugadorService segJugadorService;

	/**
	 * Constructor por defecto
	 */
	public SancionesAction() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para buscar amonestados
	 */
	@Begin(join = true)
	public void search() {
		if (jornada != null) {
			List<Sancion> sancionados = new ArrayList<Sancion>();
			sancionados.addAll(jornada.getSanciones());
			List<PartidoL> partidos = new ArrayList<PartidoL>();
			partidos.addAll(jornada.getM_partidos());
			amonestacionesJornada = amonestacionService
					.getAmonestaciones(partidos);
			if (amonestacionesJornada != null
					&& amonestacionesJornada.size() > 0) {
				if (amonestados == null) {
					amonestados = new ArrayList<SegJugador>();
				}
				for (Amonestacion a : amonestacionesJornada) {
					if (!amonestados.contains(a.getJugador())) {
						amonestados.add(a.getJugador());
					}
				}
				List<SegJugador> amonestadosEliminar = new ArrayList<SegJugador>();
				for (SegJugador j : amonestados) {
					for (Sancion san : sancionados) {
						if (san.getJugador().equals(j.getPartJugador())) {
							amonestadosEliminar.add(j);
						}
					}
				}
				if (amonestadosEliminar != null
						&& amonestadosEliminar.size() > 0) {
					for (SegJugador j : amonestadosEliminar) {
						amonestados.remove(j);
					}
				}
				totalAmon = amonestados.size();
			} else {
				amonestados = new ArrayList<SegJugador>();
				totalAmon = 0;
			}
		} else {
			FacesMessages
					.instance()
					.add(
							"Debe seleccionar una jornada para poder buscar las sanciones");
		}
	}

	/**
	 * Método para ver las tarjetas que tiene un jugador
	 * 
	 * @param jug
	 * @return
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public String verTarjetas(SegJugador jug) {
		StringBuffer url = new StringBuffer();
		TipoAmonestacionDic ta = null;
		TipoAmonestacionDic tr = null;
		TipoAmonestacionDic taz = null;
		int numta = 0;
		if (amonestacionesJornada != null && amonestacionesJornada.size() > 0) {
			for (Amonestacion a : amonestacionesJornada) {
				if (a.getTipo() != null) {
					if (a.getJugador().equals(jug)) {
						if (a.getTipo().getTipo().equals("Tarjeta amarilla")) {
							ta = new TipoAmonestacionDic();
							ta = a.getTipo();
							numta++;
						} else if (a.getTipo().getTipo().equals("Tarjeta roja")) {
							tr = new TipoAmonestacionDic();
							tr = a.getTipo();
						} else if (a.getTipo().getTipo().equals("Tarjeta azul")) {
							taz = new TipoAmonestacionDic();
							taz = a.getTipo();
						}
					}
				}
			}
		}
		if (ta != null && numta == 1 && tr == null && taz == null) {
			// sólo tiene una tarjeta amarilla
			url.append("/temas/tiki/imagenes/iconitos/tarjetaAmarilla.png");
		} else if (ta != null && numta == 2 && tr == null && taz == null) {
			// tiene doble tarjeta amarilla
			url
					.append("/temas/tiki/imagenes/iconitos/tarjetaAmarillaDoble.png");
		} else if (ta == null && tr != null && taz == null) {
			// tiene tarjeta roja
			url.append("/temas/tiki/imagenes/iconitos/tarjetaRoja.png");
		} else if (ta == null && tr == null && taz != null) {
			// tiene tarjeta azul
			url.append("/temas/tiki/imagenes/iconitos/tarjetaAzul.png");
		} else if (ta != null && numta == 1 && tr != null && taz == null) {
			// tiene una amarilla y una roja
			url
					.append("/temas/tiki/imagenes/iconitos/tarjetaAmarillaYRoja.png");
		} else if (ta != null && numta == 2 && tr != null && taz == null) {
			// tiene doble amarilla y una roja
			url
					.append("/temas/tiki/imagenes/iconitos/tarjetaDobleAmarillaYRoja.png");
		} else if (ta != null && numta == 1 && tr == null && taz != null) {
			// tiene una amarilla y una azul
			url
					.append("/temas/tiki/imagenes/iconitos/tarjetaAmarillaYAzul.png");
		} else if (ta != null && numta == 2 && tr == null && taz != null) {
			// tiene doble amarilla y una azul
			url
					.append("/temas/tiki/imagenes/iconitos/tarjetaDobleAmarillaYAzul.png");
		}
		return url.toString();
	}

	/**
	 * Método para cargar los datos de un sanción y sancionar a un jugador
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void sancionar() {
		if (amonestadoItem != null) {
			sancion = new Sancion();
			sancion.setJugador(amonestadoItem.getPartJugador());
			sancion.setActiva(false);
			sancion.setComite(amonestadoItem.getPartJugador().getTemporada()
					.getComite());
			if (amonestadoItem.getSegEquipo().getPartido() instanceof PartidoL) {
				PartidoL p = (PartidoL) amonestadoItem.getSegEquipo()
						.getPartido();
				sancion.setJornadaSancion(p.getJornada());
			} else if (amonestadoItem.getSegEquipo().getPartido() instanceof PartidoPO) {
				PartidoPO p = (PartidoPO) amonestadoItem.getSegEquipo()
						.getPartido();
				sancion.setRondaSancion(p.getRonda());
			}
			tiposSancion = tipoSancionService.getList();
			tarjeta = verTarjetas(amonestadoItem);
		}
	}

	/**
	 * Método para editar una sanción ya establecida
	 * 
	 * @param san
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void editar(Sancion san) {
		this.sancion = san;
		consulta = false;
		obtenerDatosAmonestacion();
	}

	/**
	 * Método para consultar una sanción ya establecida
	 * 
	 * @param san
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void consultar(Sancion san) {
		this.sancion = san;
		consulta = true;
		obtenerDatosAmonestacion();
	}

	/**
	 * Método para obtener los datos de una amonestación
	 */
	private void obtenerDatosAmonestacion() {
		// Datos para ver las tarjetas del jugador
		List<PartidoL> partidos = new ArrayList<PartidoL>();
		partidos.addAll(sancion.getJornadaSancion().getM_partidos());
		amonestacionesJornada = amonestacionService.getAmonestaciones(partidos);
		SegJugador seguimiento = segJugadorService.getSeguimientoJornada(
				sancion.getJugador(), sancion.getJornadaSancion());
		tarjeta = verTarjetas(seguimiento);
	}

	/**
	 * Método para guardar los datos de una sanción
	 */
	public void guardar() {
		if (sancion != null) {
			if (sancion.getPartidosPendientes() <= sancion.getPartidosSancion()) {
				if (sancionService.save(sancion)) {
					FacesMessages.instance().add(
							"Se ha guardado correctamente la sanción");
				} else {
					FacesMessages
							.instance()
							.add(
									"Se ha producido un error durante el proceso de guardado");
				}
			} else {
				FacesMessages
						.instance()
						.add(
								"No pueden quedar más partidos pendientes que el total de partidos de sanción");
			}
		}
	}

	/**
	 * Método para inicializar todos los parámetros al volver a la pantalla de
	 * consulta de sanciones
	 */
	public void volver() {
		limpiar();
	}

	/**
	 * Método para inicializar todos los parámetros al volver al menú principal
	 */
	@End
	public void menu() {
		limpiar();
	}

	private void limpiar() {
		sancion = null;
		tiposSancion = null;
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return
	 */
	public List<Temporada> getTemporadas() {
		if (temporadas == null) {
			temporadas = temporadaService.getList();
		}
		return temporadas;
	}

	/**
	 * 
	 * @param temporadas
	 */
	public void setTemporadas(List<Temporada> temporadas) {
		this.temporadas = temporadas;
	}

	/**
	 * 
	 * @return
	 */
	public Temporada getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return
	 */
	public Jornada getJornada() {
		return jornada;
	}

	/**
	 * 
	 * @param jornada
	 */
	public void setJornada(Jornada jornada) {
		this.jornada = jornada;
	}

	/**
	 * 
	 * @return
	 */
	public List<Jornada> getJornadas() {
		if (temporada != null) {
			jornadas = new ArrayList<Jornada>();
			jornadas
					.addAll(temporada.getLiga().getCalendario().getM_jornadas());
			Collections.sort(jornadas);
		} else {
			jornadas = new ArrayList<Jornada>();
		}
		return jornadas;
	}

	/**
	 * 
	 * @param jornadas
	 */
	public void setJornadas(List<Jornada> jornadas) {
		this.jornadas = jornadas;
	}

	/**
	 * 
	 * @return
	 */
	public List<Amonestacion> getAmonestacionesJornada() {
		return amonestacionesJornada;
	}

	/**
	 * 
	 * @param amonestacionesJornada
	 */
	public void setAmonestacionesJornada(
			List<Amonestacion> amonestacionesJornada) {
		this.amonestacionesJornada = amonestacionesJornada;
	}

	/**
	 * 
	 * @return
	 */
	public List<SegJugador> getAmonestados() {
		return amonestados;
	}

	/**
	 * 
	 * @param amonestados
	 */
	public void setAmonestados(List<SegJugador> amonestados) {
		this.amonestados = amonestados;
	}

	/**
	 * 
	 * @return
	 */
	public SegJugador getAmonestadoItem() {
		return amonestadoItem;
	}

	/**
	 * 
	 * @param amonestadoItem
	 */
	public void setAmonestadoItem(SegJugador amonestadoItem) {
		this.amonestadoItem = amonestadoItem;
	}

	/**
	 * 
	 * @return
	 */
	public int getTotalAmon() {
		return totalAmon;
	}

	/**
	 * @param totalAmon
	 */
	public void setTotalAmon(int totalAmon) {
		this.totalAmon = totalAmon;
	}

	/**
	 * 
	 * @return
	 */
	public Sancion getSancion() {
		return sancion;
	}

	/**
	 * 
	 * @param sancion
	 */
	public void setSancion(Sancion sancion) {
		this.sancion = sancion;
	}

	/**
	 * 
	 * @return
	 */
	public List<TipoSancionDic> getTiposSancion() {
		return tiposSancion;
	}

	/**
	 * 
	 * @param tiposSancion
	 */
	public void setTiposSancion(List<TipoSancionDic> tiposSancion) {
		this.tiposSancion = tiposSancion;
	}

	/**
	 * 
	 * @return
	 */
	public String getTarjeta() {
		return tarjeta;
	}

	/**
	 * 
	 * @param tarjeta
	 */
	public void setTarjeta(String tarjeta) {
		this.tarjeta = tarjeta;
	}

	/**
	 * 
	 * @return
	 */
	public boolean isConsulta() {
		return consulta;
	}

	/**
	 * 
	 * @param consulta
	 */
	public void setConsulta(boolean consulta) {
		this.consulta = consulta;
	}

}
